home *** CD-ROM | disk | FTP | other *** search
/ Resource Library: Multimedia / Resource Library: Multimedia.iso / sgml / msdos / sgml07 / sgmls.pl < prev    next >
Encoding:
Perl Script  |  1992-03-27  |  3.9 KB  |  212 lines

  1. #! /usr/bin/perl
  2.  
  3. # This is a skeleton of a perl script for processing the output of
  4. # sgmls.  You must change the parts marked with "XXX".
  5.  
  6. # XXX This is for troff: in data, turn \ into \e (which prints as \).
  7. # Backslashes in SDATA entities are left as backslashes.
  8.  
  9. $backslash_in_data = "\\e";
  10.  
  11. $prog = $0;
  12.  
  13. $prog =~ s|.*/||;
  14.  
  15. $level = 0;
  16.  
  17. while (<STDIN>) {
  18.     chop;
  19.     $command = substr($_, 0, 1);
  20.     substr($_, 0, 1) = "";
  21.     if ($command eq '(') {
  22.     &start_element($_);
  23.     $level++;
  24.     }
  25.     elsif ($command eq ')') {
  26.     $level--;
  27.     &end_element($_);
  28.     foreach $key (keys %attribute_value) {
  29.         @splitkey = split($;, $key);
  30.         if ($splitkey[0] == $level) {
  31.         delete $attribute_value{$key};
  32.         delete $attribute_type{$key};
  33.         }
  34.     }
  35.     }
  36.     elsif ($command eq '-') {
  37.     &unescape_data($_);
  38.     &data($_);
  39.     }
  40.     elsif ($command eq 'A') {
  41.     @field = split(/ /, $_, 3);
  42.     $attribute_type{$level,$field[0]} = $field[1];
  43.     &unescape_data($field[2]);
  44.     $attribute_value{$level,$field[0]} = $field[2];
  45.     }
  46.     elsif ($command eq '&') {
  47.     &entity($_);
  48.     }
  49.     elsif ($command eq 'D') {
  50.     @field = split(/ /, $_, 4);
  51.     $data_attribute_type{$field[0], $field[1]} = $field[2];
  52.     &unescape_data($field[3]);
  53.     $data_attribute_value{$field[0], $field[1]} = $field[3];
  54.     }
  55.     elsif ($command eq 'N') {
  56.     @field = split(/ /, $_, 3);
  57.     &unescape($field[1]);
  58.     $notation_sysid{$field[0]} = $field[1];
  59.     if ($#field == 2) {
  60.         &unescape($field[1]);
  61.         $notation_pubid{$field[0]} = $field[2];
  62.     }
  63.     }
  64.     elsif ($command eq 'I') {
  65.         @field = split(/ /, $_, 3);
  66.     $entity_type{$field[0]} = $field[1];
  67.     &unescape($field[2]);
  68.     # You may want to substitute \e for \ if the type is CDATA.
  69.     $entity_text{$field[0]} = $field[2];
  70.     $entity_code{$field[0]} = 'I';
  71.     }
  72.     elsif ($command eq 'E') {
  73.     @field = split(/ /, $_);
  74.     $entity_code{$field[0]} = 'E';
  75.     $entity_type{$field[0]} = $field[1];
  76.     $entity_notation{$field[0]} = $field[2];
  77.     foreach $i (3 .. $#field) {
  78.         &unescape($field[$i]);
  79.         $entity_filename{$field[0], $i - 3} = $field[i];
  80.     }
  81.     }
  82.     elsif ($command eq 'S') {
  83.     @field = split(/ /, $_);
  84.     $entity_code{$field[0]} = 'S';
  85.     foreach $i (1 .. $#field) {
  86.         &unescape($field[$i]);
  87.         $entity_filename{$field[0], $i - 1} = $field[i];
  88.     }
  89.     }
  90.     elsif ($command eq '?') {
  91.     &unescape($_);
  92.     &pi($_);
  93.     }
  94.     elsif ($command eq 'L') {
  95.     @field = split(/ /, $_);
  96.     $lineno = $field[0];
  97.     if ($#field >= 1) {
  98.         &unescape($field[1]);
  99.         $filename = $field[1];
  100.     }
  101.     }
  102.     elsif ($command eq 'V') {
  103.     @field = split(/ /, $_, 2);
  104.     &unescape($field[1]);
  105.     $environment{$field[0]} = $field[1];
  106.     }
  107.     elsif ($command eq '{') {
  108.     &start_subdoc($_);
  109.     }
  110.     elsif ($command eq '}') {
  111.     &end_subdoc($_);
  112.     }
  113.     else {
  114.     warn "$prog:$ARGV:$.: unrecognized command \`$command'\n";
  115.     }
  116. }
  117.  
  118. sub unescape {
  119.     $_[0] =~ s/\\([0-7][0-7]?[0-7]?|.)/&esc($1)/eg;
  120. }
  121.  
  122. sub esc {
  123.     local($_) = $_[0];
  124.     if (/^[0-7]/) {
  125.     sprintf("%c", oct);
  126.     }
  127.     elsif ($_ eq 'n') {
  128.     "\n";
  129.     }
  130.     elsif ($_ eq 's') {
  131.     " ";
  132.     }
  133.     elsif ($_ eq '|') {
  134.     "";
  135.     }
  136.     elsif ($_ eq "\\") {
  137.     "\\";
  138.     }
  139.     else {
  140.     $_;
  141.     }
  142. }
  143.  
  144. sub unescape_data {
  145.     local($sdata) = 0;
  146.     $_[0] =~ s/\\([0-7][0-7]?[0-7]?|.)/&esc_data($1)/eg;
  147. }
  148.  
  149. sub esc_data {
  150.     local($_) = $_[0];
  151.     if (/^[0-7]/) {
  152.     sprintf("%c", oct);
  153.     }
  154.     elsif ($_ eq 'n') {
  155.     "\n";
  156.     }
  157.     elsif ($_ eq 's') {
  158.     " ";
  159.     }
  160.     elsif ($_ eq '|') {
  161.     $sdata = !$sdata;
  162.     "";
  163.     }
  164.     elsif ($_ eq "\\") {
  165.     $sdata ? "\\" : $backslash_in_data;
  166.     }
  167.     else {
  168.     $_;
  169.     }
  170. }
  171.  
  172.  
  173. sub start_element {
  174.     local($gi) = $_[0];
  175.     # XXX
  176. }
  177.  
  178. sub end_element {
  179.     local($gi) = $_[0];
  180.     # XXX
  181. }
  182.  
  183. sub data {
  184.     local($data) = $_[0];
  185.     # XXX
  186. }
  187.  
  188. # A processing instruction.
  189.  
  190. sub pi {
  191.     local($data) = $_[0];
  192.     # XXX
  193. }
  194.  
  195. # A reference to an external entity.
  196.  
  197. sub entity {
  198.     local($name) = $_[0];
  199.     # XXX
  200. }
  201.  
  202. sub start_subdoc {
  203.     local($name) = $_[0];
  204.     # XXX
  205. }
  206.  
  207. sub end_subdoc {
  208.     local($name) = $_[0];
  209.     # XXX
  210. }
  211.  
  212.